﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MVVMDemo.Model;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Data;
using System.Windows.Input;

namespace MVVMDemo.ViewModel
{
    public class MasterViewModel:ViewModelBase
    {
        /// <summary>
        /// Binding tập hợp các đối tượng và control
        /// Class ObservableCollection được sử dụng để binding tập hợp các đối tượng
        /// Cung cấp 2 interface: INotifyPropertyChanged abd INotifyCollectionChanged
        /// 
        /// </summary>
        #region fields
        private readonly Database db;
        private readonly ObservableCollection<PersonViewModel> persons;
        private readonly ICollectionView collectionView;
        private ICommand addCommand;
        private ICommand removeCommand;
        private ICommand previousCommand;
        private ICommand nextCommand;

        #endregion

        public MasterViewModel(Database db)
        {
            this.db = db;
            this.persons = new ObservableCollection<PersonViewModel>();

            //Mỗi person trong DB, tạo một PersonViewModel bao/bọc nó
            //for each person in the database. create a PersonViewModel that wrap it
            foreach (Person person in this.db.Persons)
            {
                this.persons.Add(new PersonViewModel(person));
            }

            //lấy ICollectionView liên quan đến ObservableCollection của PersonViewModel
            //hàm throw dùng để ném ngoại lệ
            //cú pháp throw -đối tượng được ném: throw<object>
         
            this.collectionView = CollectionViewSource.GetDefaultView(this.persons);
            if (this.collectionView == null)
                throw new NullReferenceException("collectionView");

            //lắng nghe sự kiện CurrentChanged để được thông báo khi thay đổi sự lựa chọn
            this.collectionView.CurrentChanged += new EventHandler(this.OnCollectionViewCurrentChanged);
            
        }
        #region properties

        public ObservableCollection<PersonViewModel> Persons
        {
            get { return this.persons; }
        }

        public PersonViewModel SelectedPerson
        {
            get { return this.collectionView.CurrentItem as PersonViewModel; }
        }
        
        #endregion

       

        #region commands

        //Lệnh xử lý nút add một đối tượng vào database
        public ICommand AddCommand
        {
            get 
            {
                if (this.addCommand == null)
                    this.addCommand = new RelayCommand(() => this.AddPerson(), () => this.CanAddPerson());
                return this.addCommand;
            }
        }
                
        #endregion

        private bool CanAddPerson()
        {
            return this.persons.Count < 5;

        }

        private void AddPerson()
        {
            Person newPerson = this.db.AddPerson("firstname", "lastname", 25, Gender.Male);
            this.persons.Add(new PersonViewModel(newPerson));
        }


        private void OnCollectionViewCurrentChanged(object sender, EventArgs e)
        {
            OnPropertyChanged("SelectedPerson");
        }
    }
    


}
